package com.sky.interceptor;


import com.sky.context.BaseContext;
import com.sky.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * jwt令牌校验的拦截器
 */
@Component
@Slf4j
public class JwtTokenUserInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断当前的拦截到的是Controller的方法还是其他资源
        if(!(handler instanceof HandlerMethod))
        {
            return true;
        }
        //从请求头中获取token
        String token = request.getHeader("authentication");
        //非空判断
        if (token==null){
            //如果为空，发送错误异常
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        //如果不为空，则判断这个token是否有效
        Claims claimsBody = JwtUtil.getClaimsBody(token);

        //这个工具类回返回数字：-1：有效 0：有效 1：过期 2：过期
        int i = JwtUtil.verifyToken(claimsBody);

//        进行有效判断
        if (i==-1 || i==0){
            //如果有效，则把用户的id封装到ThreadLoci对象中
            //获取用户id，封装成Interger类型
            Integer id = (Integer) claimsBody.get("id");
            BaseContext.setCurrentId(id.longValue());

            return true;

        }else
        {
//            条件不满足则返回错误信息
            response.setStatus(401);
            return false;
        }
    }
}
